/**
 * Windows Application Programming Interface (WinAPI)
 * Win32 ist die 32-Bit-API für moderne Versionen von Windows.
 * Näher dazu unter: http://de.wikipedia.org/wiki/Windows_Application_Programming_Interface
 * 
 * Windows API List: http://msdn.microsoft.com/en-us/library/ff818516.aspx
 * 
 * Verwendete Dokumentationen:
 * http://msdn.microsoft.com/en-us/library/ee663266.aspx
 *  *Controls:*
 *    - http://msdn.microsoft.com/en-us/library/bb773169.aspx
 *    - http://msdn.microsoft.com/en-us/library/gg153547.aspx (Mouse, Keyboard)
 */
#include "GUI.h"
#include "Util.h"

GUI guiObject;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

/**
 * WinMain()
 * Die main Funktion(Ersatz) bei WINAPI Programmierung und ist die erste ausführbare Funktion.
 * 
 * @param hInstance     Handle der aktuellen Instanz. Ist bei WIN32-Anwendungen immer deren Ladeadresse und besitzt den in der Regel den Wert 0x400000.
 * @param hPrevInstance Handle der vorherigen Instanz der Anwendung. Bei WIN32-Anwendungen hat dieser Parameter immer den Wert 0.
 * @param szCmdLine     Zeiger auf die Befehlszeile (als String) mit der die Anwendung gestartet wurde.
 * @param iCmdShow      Gibt an wie das Hauptfenster der Anwendung dargestellt werden soll.
 * @return 
 */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    MSG msg;
    WNDCLASS wc;

    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = &WndProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wc.lpszClassName = guiObject.getAppName();
    wc.lpszMenuName = NULL;
    RegisterClass(&wc);

    guiObject.createWindow(hInstance);

    ShowWindow(guiObject.getMainWindow(), iCmdShow);
    UpdateWindow(guiObject.getMainWindow());

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

/**
 * WndProc()
 * Eventhandler des Hauptfensters. Der eigentliche Rumpf der Funktion WndProc wurde in die windowEventhandler-Funktion des GUI Objekts
 * gekapselt. Grund dafür ist, dass die WndProc-Funktion in der main.cpp neben der WinMain-Funktion stehen muss um diese mit dem Namen 
 * für die Variable wc.lpfnWndProc ansprechen zu können.
 * @param hwnd     Handler des Fensters bzw. Elternelements
 * @param message  Vom Handler gelieferte Rückmeldung
 * @param wParam   Zusätzliche Nachrichteninformation vom Handler
 * @param lParam   Zusätzliche Nachrichteninformation vom Handler
 * @return 
 */
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    guiObject.windowEventhandler(hwnd, message, wParam, lParam);
}
